package com.AdvancedDemos.集合.单列集合;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.function.Predicate;

public class LearnList {
    public static void main(String[] args) {
        /**
         * List<E>是一个泛型接口
         * 他代表的集合的特点存取有序,允许重复,有索引
         *
         *他下面的两个实现类
         * ArrayList:有序,元素可重复,有索引
         * LinkedList:有序,元素可重复,有索引
         *
         * List集合因为支持索引,所以多了一些索引相关的方法,同时Collection中的方法都继承了
         *
         * void add(int index,E element) --- 在此集合中的指定位置插入指定的元素
         * E remove(int index) --- 删除指定索引处的元素,并返回被删除的元素
         * E set(int index,E element) --- 修改指定索引处的元素,并返回被修改的元素
         * E get(int index) --- 返回指定索引处的元素
         */
        List<String> list = new ArrayList<>();
        list.add("蜘蛛精");
        list.add("至尊宝");
        list.add("至尊宝");
        list.add("牛夫人");
        System.out.println("原始集合:" + list);//[蜘蛛精, 至尊宝, 至尊宝, 牛夫人] 有序,可重复

        list.add(2, "露娜");
        System.out.println("插入2号元素后:" + list);

        String remove = list.remove(3);
        System.out.println("被删除的3号元素:" + remove);
        System.out.println("删除3号元素后:" + list);

        String s = list.get(3);
        System.out.println("被获取的3号元素:" + s);

        s = list.set(3, "牛魔王");
        System.out.println("3号元素原数据:" + s);
        System.out.println("3号元素修改后:" + list);


        //条件删除
        list.removeIf(new Predicate<String>() {
            @Override
            public boolean test(String str) {
                return new String("1234").equals(str);
            }
        });


        //将集合元素随机排列,洗牌shuffle
        Collections.shuffle(list);

        /**
         * 原来Collection中常用方法List中都可以正常调用:
         * 1.public boolean add(E e) 添加元素,添加成功返回true,失败返回false
         * 2.public void clear() 清空集合的元素
         * 3.public boolean isEmpty() 判断集合是否为空,是空返回true,反之,返回false
         * 4.public int size() 获取集合的大小
         * 5.public boolean contains(Object obj) 判断集合中会否包含某个元素
         * 6.public boolean remove(E e) 删除某个元素,如果有多个重复元素,默认删除前面的第一个
         * 7.public Object[] toArray() 把集合转成数组
         * 8.把一个集合的全部数据添加另一个集合中去 c1.addAll(c2);//把c2集合中的全部数据添加到c1集合中去,c2集合原数据还在(应当注意两者泛型应当一致)
         */


        /**
         * List集合支持的遍历方式:
         * 1.for循环(因为List集合有索引)
         * 以及Collection支持的三种遍历方式
         * 2.iterator迭代器
         * 3.增强的for循环
         * 4.forEach函数 + Lambda表达式
         */
        System.out.println("----------------------");
        System.out.println("list集合内容现在如下 : " + list);
        System.out.println("----------------------");
        System.out.println("1.使用for循环遍历:");
        for (int i = 0; i < list.size(); i++) {
            String s1 = list.get(i);
            System.out.println(s1);
        }
        System.out.println("----------------------");
        System.out.println("2.使用迭代器遍历:");
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        System.out.println("----------------------");
        System.out.println("3.使用增强的for循环遍历:");
        for (String s1 : list) {
            System.out.println(s1);
        }
        System.out.println("----------------------");
        System.out.println("4.使用forEach函数 + Lambda表达式遍历:");
        list.forEach(/*new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        }*/
                s12 -> System.out.println(s12)
        );
    }
}
